package llm

const (
	ChatMessageRoleSystem    = "system"
	ChatMessageRoleUser      = "user"
	ChatMessageRoleAssistant = "assistant"
)

type Provider struct {
	BaseUrl string
	ApiKey  string
}

type ChatCompletionMessage struct {
	Role       string     `json:"role"`
	Content    string     `json:"content"`
	ToolCalls  []ToolCall `json:"tool_calls,omitempty"`
	ToolCallID string     `json:"tool_call_id,omitempty"`
}

type ResponseFormat struct {
	Type string `json:"type"`
}

type Tools struct {
	Type     string   `json:"type"`
	Function Function `json:"function"`
}

type Parameters struct {
	Type       string                 `json:"type"` // Type of the parameters, e.g., "object" (required)
	Properties map[string]interface{} `json:"properties,omitempty"`
	Required   []string               `json:"required,omitempty"`
}

type Function struct {
	Name        string      `json:"name"`                  // The name of the function (required)
	Description string      `json:"description,omitempty"` // Description of the function (required)
	Parameters  *Parameters `json:"parameters,omitempty"`  // Parameters schema (optional)
}

type ChatCompletionRequest struct {
	Model           string                  `json:"model"`                      // 模型名称
	Messages        []ChatCompletionMessage `json:"messages"`                   // 由历史对话组成的消息列表
	Stream          bool                    `json:"stream"`                     // 是否流式输出回复
	MaxTokens       int                     `json:"max_tokens,omitempty"`       // 本次请求返回的最大 Token 数
	PresencePenalty float32                 `json:"presence_penalty,omitempty"` // 控制模型生成文本时的内容重复度，取值范围：[-2.0, 2.0]。正数会减少重复度，负数会增加重复度
	Temperature     float32                 `json:"temperature,omitempty"`      // 采样温度，控制模型生成文本的多样性
	TopP            float32                 `json:"top_p,omitempty"`            // 核采样的概率阈值，控制模型生成文本的多样性
	ResponseFormat  *ResponseFormat         `json:"response_format,omitempty"`  // 返回内容的格式。可选值：{"type": "text"}或{"type": "json_object"}
	Tools           []Tools                 `json:"tools,omitempty"`            // 可供模型调用的工具数组，可以包含一个或多个工具对象
}
